package br.ufrj.neg.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.io.IOUtils;
import org.apache.velocity.Template;
import org.apache.velocity.context.Context;
import org.apache.velocity.tools.view.VelocityViewServlet;

import br.ufrj.neg.bean.Idioma;
import br.ufrj.neg.evento.bean.LogomarcaBean;
import br.ufrj.neg.evento.bean.TipoLogomarcaEnum;
import br.ufrj.neg.evento.model.LogomarcaModel;
import br.ufrj.neg.preparacao.bean.NegociacaoBean;
import br.ufrj.neg.preparacao.model.NegociacaoModel;
import br.ufrj.neg.util.Data;

public class AlterarNegociacaoAction extends VelocityViewServlet{

	private static final long serialVersionUID = -1502095409248120929L;
	private static final String TMP_DIR_PATH ="/imagens/logos/temp";
	private File tmpDir;
	private static final String DESTINATION_DIR_PATH ="/imagens/logos";
	private File destinationDir;
 
	@Override
	public void init() throws ServletException {
		
		super.init();
//		tmpDir = new File(TMP_DIR_PATH);
//		if(!tmpDir.isDirectory()) {
//			throw new ServletException(TMP_DIR_PATH + " is not a directory");
//		}
		String realPath = getServletContext().getRealPath(DESTINATION_DIR_PATH);
		destinationDir = new File(realPath);
		if(!destinationDir.isDirectory()) {
			throw new ServletException(DESTINATION_DIR_PATH+" is not a directory");
		}
		realPath = getServletContext().getRealPath(TMP_DIR_PATH);
		tmpDir = new File(realPath);
		if(!tmpDir.isDirectory()) {
			throw new ServletException(TMP_DIR_PATH+" is not a directory");
		}

		
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws IOException, ServletException {
		
		String nomeNegociacao = null;
		String nomeCliente = null;
		String negociadorMediador = null;//request.getParameter("negociadorNegocio");
		String dataAtualizacao = null;//request.getParameter("dataNegocio");
		String caminhoLogoNegociador = null;
		String caminhoLogoCliente = null;
		Boolean haLogoClienteCadastrada = false;
		Boolean haLogoNegociadorCadastrada = false;
				
		DiskFileItemFactory  fileItemFactory = new DiskFileItemFactory ();
		fileItemFactory.setSizeThreshold(2*1024*1024); //1 MB
		//fileItemFactory.setRepository(tmpDir);
		ServletFileUpload uploadHandler = new ServletFileUpload(fileItemFactory);
		try {
			List items = uploadHandler.parseRequest(request);
			Iterator itr = items.iterator();
			while(itr.hasNext()) {
				FileItem item = (FileItem) itr.next();
				
				
				
				if(item.isFormField()) {
						
					//System.out.println(item.getFieldName());
					//System.out.println(item.getString());
					
					if(item.getFieldName().equals("nomeNegocio")){
						nomeNegociacao = item.getString("UTF8");
					}else if (item.getFieldName().equals("clienteNegocio")){
						nomeCliente = item.getString("UTF8");
					}else if (item.getFieldName().equals("negociadorNegocio")){
						negociadorMediador = item.getString("UTF8");
					}else if (item.getFieldName().equals("dataNegocio")){
						dataAtualizacao = item.getString("UTF8");
					}else if (item.getFieldName().equals("logoHiddenNegociador")){
						haLogoNegociadorCadastrada = Boolean.parseBoolean(item.getString("UTF8"));
					}else if (item.getFieldName().equals("logoHiddenCliente")){
						haLogoClienteCadastrada = Boolean.parseBoolean(item.getString("UTF8"));
					}else if(item.getFieldName().equals("urlLogoNegociador")){
						
						if(!item.getString("UTF8").equals("")){
							caminhoLogoNegociador = item.getString("UTF8");
						}
						
					}else if(item.getFieldName().equals("urlLogoCliente")){
						
						if(!item.getString("UTF8").equals("")){
							caminhoLogoCliente = item.getString("UTF8");
						}
						
					}
					
					
				} else if(!item.getName().equals("")){
						
					/*
						if(item.getFieldName().equals("minhaLogo")){ //minhaLogo
												
							caminhoLogoNegociador = item.getName();
				
							
						}else{
							//Set destinatioDir
							caminhoLogoCliente = item.getName();
							
						}
							//File Name = "+item.getName()+
							// Content type = "+item.getContentType()+
							// File Size = "+item.getSize());
						
						File file = new File(destinationDir,item.getName());
						item.write(file);
				*/
				}
				
				
			}
		}catch(FileUploadException ex) {
			ex.printStackTrace();//log("Error encountered while parsing the request",ex);
		} catch(Exception ex) {
			ex.printStackTrace();//log("Error encountered while uploading file",ex);
		}
 
		/*
		 * Monta o NegociacaoBean
		 */
		
		
		
		NegociacaoModel nm = new NegociacaoModel();
	
		
		NegociacaoBean nb = (NegociacaoBean) request.getSession().getAttribute("negociacao");
		
		nb.setNegociacao(nomeNegociacao);
		nb.setCliente(nomeCliente);
		
		try{
			nb.setDataAtualizacao(  new Data(dataAtualizacao) );
		}catch(Exception ex){
			ex.printStackTrace();
		}
		nb.setNegociador(negociadorMediador);
		nm.atualizaNegociacao(nb);		
		
		FileInputStream fis = null;
		FileOutputStream fos = null;
		File clienteFile = null;
		File negociadorFile = null;
		
		//FIXME: _Muitos casos, ver refactor?
		if(caminhoLogoNegociador!=null && caminhoLogoCliente !=null){
			String caminhoFinalLogoCliente = nb.getIdNegociacao()+"_"+caminhoLogoCliente;
			String caminhoFinalLogoNegociador = nb.getIdNegociacao()+"_"+caminhoLogoNegociador;
			
			
			//Lógica de adicao no bd
			if(haLogoClienteCadastrada && haLogoNegociadorCadastrada){
				LogomarcaModel.atualizaLogomarcasPorNegociacao(nb, new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index()),new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index()));
			
			}else if(haLogoClienteCadastrada){
				LogomarcaModel.atualizaLogomarcaPorNegociacaoETipo(nb, new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index()));
			}else if(haLogoNegociadorCadastrada){
				LogomarcaModel.atualizaLogomarcaPorNegociacaoETipo(nb, new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index()));
			}else{
				LogomarcaModel.cadastraLogomarcasPorNegociacao(nb, new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index()),new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index()));
			}
			
			clienteFile = new File(tmpDir,caminhoLogoCliente);

			fis = new FileInputStream(clienteFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoCliente));
			IOUtils.copy(fis, fos);
			
			negociadorFile = new File(tmpDir,caminhoLogoNegociador);
			fis = new FileInputStream(negociadorFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoNegociador));
			IOUtils.copy(fis, fos);
			
			clienteFile.delete();
			negociadorFile.delete();
			
		}else if(caminhoLogoNegociador!=null) {
			String caminhoFinalLogoNegociador = nb.getIdNegociacao()+"_"+caminhoLogoNegociador;
			
			
			if(haLogoNegociadorCadastrada){
				LogomarcaModel.atualizaLogomarcaPorNegociacaoETipo(nb, new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index()));
			}else{
				LogomarcaModel.cadastraLogomarca(new LogomarcaBean(caminhoFinalLogoNegociador,TipoLogomarcaEnum.PROPRIO.index(),nb.getIdNegociacao()));	
			}
			
			negociadorFile = new File(tmpDir,caminhoLogoNegociador);
			
			fis = new FileInputStream(negociadorFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoNegociador));
			IOUtils.copy(fis, fos);
			
			negociadorFile.delete();
			
			
			
		}else if(caminhoLogoCliente!=null){
			
			String caminhoFinalLogoCliente = nb.getIdNegociacao()+"_"+caminhoLogoCliente;
			
			
			
			if(haLogoClienteCadastrada){
				LogomarcaModel.atualizaLogomarcaPorNegociacaoETipo(nb, new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index()));
			}else{
				LogomarcaModel.cadastraLogomarca(new LogomarcaBean(caminhoFinalLogoCliente,TipoLogomarcaEnum.CLIENTE.index(),nb.getIdNegociacao()));
			}
			
			clienteFile = new File(tmpDir,caminhoLogoCliente);
			fis = new FileInputStream(clienteFile);
			fos = new FileOutputStream(new File(destinationDir,caminhoFinalLogoCliente));
			IOUtils.copy(fis, fos);
			
			clienteFile.delete();
			
			
		}
		
		response.sendRedirect("/reuniao");
		
	}
	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
	throws IOException, ServletException {
		HttpSession session = request.getSession();
		request.setCharacterEncoding("utf-8");
		
		Idioma idioma = (Idioma) request.getAttribute("idioma");
		String idNegocio = request.getParameter("idNegociacao");
		
		NegociacaoModel nm = new NegociacaoModel();
		NegociacaoBean nb = nm.getNegociacao( Integer.valueOf(idNegocio) );
		
		HashMap<Integer, LogomarcaBean> logosDataSet = LogomarcaModel.getLogomarcasPorNegociacao(Integer.parseInt(idNegocio));
				
		session.setAttribute("negociacao", nb);
			
		Context context = createContext(request, response);
		setContentType(request, response);
		
		context.put("logomarcasDataSet", logosDataSet);
		context.put("negociacaoContext", nb);
		context.put("pageContext",new PageContext(request));
		
		Template template = getTemplate("templates/preparacao/editarNegocio.vm");
		mergeTemplate(template, context, response);				
	}
}
